/**
 *  该指令可以在输入框指定只能输入数字的大小长度等
 *  使用方式v-maxnum="{
 *  obj:obj,        obj表示要作用的对象
 *  key:key,        key表示作用的属性
 *  max:max,        max表示最大的值
 *  int:false,      int表示是不是整数，默认为false 可以有小数
 *  length:length,  如果int为false表示的是小数点后的位数，如果int为true表示的是输入的长度
 *  zero:false,     zero表示可否为0，默认为fale 不可以为0
 *  str:false       str表示返回的是不是字符类型，默认为false表示返回的是数值类型
 *  }"
 */
 const INT_REG = /[^0-9]/g  //匹配不是数字的字符，整数匹配
 const NUM_REG = /[^0-9\.]|^\./g //匹配不是点或者数字的字符，也匹配开头是点的字符。(带小数的匹配)
 const NO_SUFFIX_REG = /\..*0+$|\.$/  //小数匹配000结尾的或者.结尾的
 export default {
     name: "maxnum",
     bind() {
     },
     inserted(el) {
         // if (el.tagName != 'INPUT') {
         //     el = el.querySelector("input")
         //     if (!el) {
         //         flag = false
         //         return
         //     }
         //     element = el
         // }
         // element = el
     },
     update(el, val) {
         if (el.tagName != 'INPUT') {
             el = el.querySelector("input")
             if (!el) return
         }
         let { max, obj, key, zero = false, int = false, str = false, length } = val.value
         
         let temp = obj[key]
         const tempStr = String(temp)
         length = Number(length)
 
         // 空字符串返回
         if (!tempStr) return
 
         // 如果不允许为0且是整数   是整数，且为0，但是为0了就清空
         if (!zero && tempStr === "0" && int) return obj[key] = ""
 
         //  如果是00开头直接变为一个0
         if (tempStr.startsWith("00")) return obj[key] = !str ? 0 : "0"
 
         temp = tempStr.replace(/。/g,".").replace(int ? INT_REG : NUM_REG, "")
         const arr = temp.split("")
         const targetIndex = arr.findIndex(item => item == '.')
         let res = arr.map((item, index) => {
             // 需要去掉第二个小数点
             if (!int && item == '.' && index != targetIndex) return
 
             // 如果length存在，就要判断位数了
             if (length && targetIndex != -1 && (index - targetIndex) > length || int && length && (index + 1) > length) return
 
             return item
         }).join("")
 
         if (max && !str && Number(max) < res) {
             // 如果存在最大值、返回的是数值类型且超出最大值就清空
             obj[key] = ""
         } else {
             // 如果是数值类型且不符合结尾正则才变为数值，否则返回的是字符，等到失焦的时候才判断
             obj[key] = (!str && !NO_SUFFIX_REG.test(res)) ? Number(res) : res
         }
 
 
         el.onblur = function () {
             if (NO_SUFFIX_REG.test(obj[key])) {
                 // /\.*0*$/
                 const temp2 = obj[key].replace(/0*$|\.$|\.0*$/, "")
                 console.log(temp2)
                 obj[key] = !str ? temp2 : Number(temp2)
             }
 
         }
     },
 }
 
 